import sys
from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt6.QtGui import QPixmap, QMouseEvent
from PyQt6.QtCore import Qt, QPoint


class ImageLabel(QLabel):
	def __init__(self, parent=None):
		super(ImageLabel, self).__init__(parent)
		# 加载并设置原始图片
		self.originalPixmap = QPixmap("2.png")
		self.setPixmap(self.originalPixmap)
		# 初始化缩放后的图片为原始图片
		self.scaledPixmap = self.originalPixmap
		# 初始化拖动状态和鼠标位置
		self.isDragging = False
		self.lastMousePosition = QPoint()
		# 初始化缩放因子
		self.scaleFactor = 1.0

	def mousePressEvent(self, event: QMouseEvent):
		# 鼠标按下事件处理
		if event.button() == Qt.MouseButton.LeftButton:
			self.isDragging = True  # 设置拖动状态
			self.lastMousePosition = event.pos()  # 记录鼠标位置

	def mouseMoveEvent(self, event: QMouseEvent):
		# 鼠标移动事件处理
		if self.isDragging:
			# 如果正在拖动，则计算鼠标移动的距离，并移动图片
			dx = event.x() - self.lastMousePosition.x()
			dy = event.y() - self.lastMousePosition.y()
			self.move(self.x() + dx, self.y() + dy)
			self.lastMousePosition = event.pos()

	def mouseReleaseEvent(self, event: QMouseEvent):
		# 鼠标释放事件处理
		if event.button() == Qt.MouseButton.LeftButton:
			self.isDragging = False  # 取消拖动状态

	def wheelEvent(self, event):
		# 鼠标滚轮事件处理
		# 根据滚轮的方向来决定是放大还是缩小
		factor = 1.25 if event.angleDelta().y() > 0 else 0.8
		self.scaleFactor *= factor  # 更新缩放因子
		# 根据缩放因子调整图片大小
		newSize = self.originalPixmap.size() * self.scaleFactor
		self.scaledPixmap = self.originalPixmap.scaled(newSize, Qt.KeepAspectRatio)
		self.setPixmap(self.scaledPixmap)  # 设置缩放后的图片


class MainWindow(QMainWindow):
	def __init__(self):
		super().__init__()
		# 设置窗口中心的控件为自定义的图片标签
		self.label = ImageLabel(self)
		self.setCentralWidget(self.label)
		# 设置窗口标题和大小
		self.setWindowTitle("PyQt 图片缩放和拖动示例")
		self.setGeometry(100, 100, 800, 600)


if __name__ == "__main__":
	# 创建并运行应用
	app = QApplication(sys.argv)
	mainWindow = MainWindow()
	mainWindow.show()
	sys.exit(app.exec())